package com.haipumi.utils;

import java.lang.reflect.Method;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class RequestUtil {
	/**
	 * 根据request 通过反射产生实例
	 * @param request
	 * @param c
	 * @return
	 */
	public static <T> T parseRequest(HttpServletRequest request,Class<T> c) {
		T t=null;
		try {
			t=c.newInstance();//根据反射实例生成对象
			Method[] ms=c.getMethods();
			//1.取出request中所有的键值对.	注意 Map<String,String[]>
			Map<String,String[]> map=request.getParameterMap();

			//2.循环所有的键,在前面加一个set 形成setxxx
			for(Map.Entry<String, String[]> entry : map.entrySet()	){
				String key=entry.getKey();
				String[] values=entry.getValue();
				if(values !=null && values.length>1){
					continue;
				}
				String v=values[0];
				key="set"+key;//方法名
				//3.循环 反射实例c中所有的方法,查找上面的setxxx的方法
				for(Method m:ms){
					if(key.equalsIgnoreCase(m.getName())){
						//4.激活这个方法,将这个键所对应的值即可,相当于你调用了set 设置了值
						//判断 m的参数类型
						String parameterType=m.getParameterTypes()[0].getName();//取出方法的参数类型名
						if("int".equals(parameterType) || "java.lang.Integer".equals(parameterType)){
							m.invoke(t, Integer.parseInt(v));
						}else if("float".equals(parameterType)|| "java.lang.Float".equals(parameterType)){
							m.invoke(t, Float.parseFloat(v));
						}else if("double".equals(parameterType)|| "java.lang.Double".equals(parameterType)){
							m.invoke(t, Double.parseDouble(v));
						}else if("long".equals(parameterType)|| "java.lang.Long".equals(parameterType)){
							m.invoke(t, Long.parseLong(v));
						}else if( "java.lang.String".equals(parameterType)){
							m.invoke(t, v);
						}
						
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return t;
	}
}
